<<<<<<< .mine
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */ 

package tasks;

import java.io.*;


public class TaskManageSubsystem implements TaskMngSubSystmIntrface, Serializable{
    
    private int OSType; // тип ОС
    private ProcessDesc ProcessList; //list header
    private int nextPid; // счетчик идентификаторов, выдаваемых вновь создаваемым процессам и потокам
    private int processesQuantity; // счетчик запущенных процессов

    // в конcтруктор передается тип создаваемой ОС, им заполняется соответствующее свойство
    public TaskManageSubsystem(int selOSType) {
        OSType = selOSType;
        nextPid = 0; //счетчик идентификаторов в 0
        processesQuantity = 0; // кол-во текущих процессов тоже 0
        ProcessList = new ProcessDesc(null, null, null); // создаем заголовочный элемент
        ProcessList.setNext(ProcessList); // и корректно заполняем его поля
        ProcessList.setPrev(ProcessList);
    }

    
    public int getOSType() {
        return OSType; // геттер для типа ОС
    }

    
    public int getNextPid() { // геттер для очередного идентификатора, 
        nextPid += 1; // при выдаче изменяем на единицу для уникальности
        return nextPid;
    }


    public boolean isEmpty() { // проверка на пустоту списка процессов
        return getProcessList() == getProcessList().getNext(); // если заголовок указывает сам на себя
    }

    // метод создания процесса принимает идентификатор процесса, определяющего место вставки, а также
    // положение вставки: до\после, максимально возможное кол-во потоков нового процесса
    public ProcessDesc createProcess(int pId, Boolean afterCurr, int threadQ) throws NotFoundException, InputErrorException { //1-afterCurr declare Order of adding, 2- threads quantity in constructor params
        if (threadQ == 0) {
            throw new InputErrorException("Threads quantity most be more than zero"); //поток у процесса должен быть хотя бы один
        } 
        try { // пробуем найти искомый процесс
            ProcessDesc current = find(pId);
            // если не нашли бросаем исключение
            if (current.getCurrent().getId() != pId) throw new NotFoundException("Process with specified PID: "+ pId +" not founded");
            else { // нашли - опеределяемся с порядком вставки
                if (afterCurr) { // после найденного
                    // создаем узел списка и заполняем поля: созданным тут же процессом(с нужными параметрами), указателями на нужные узлы
                    ProcessDesc temp = new ProcessDesc(new Process(getNextPid(), getNextPid(), threadQ), current, current.getNext()); 
                    current.getNext().setPrev(temp); // у следующего за искомым ссылку на предыдущий выставляем равной новому узлу
                    current.setNext(temp); // у искомого ссылка на следующий стала равна новому узлу
                    processesQuantity += 1; // увеличили счетчик процессов в системе
                    return temp; // вернули созданный узел
                } else { // перед найденным - практически тоже самое, что и после, только изменен порядок ссылочных частей у сопутствующих узлов
                    ProcessDesc temp = new ProcessDesc(new Process(getNextPid(), getNextPid(), threadQ), current.getPrev(), current);
                    current.getPrev().setNext(temp);
                    current.setPrev(temp);
                    processesQuantity += 1;
                    return temp;
                }
                
            }
        } catch (NoProcessesException NPE) { // в случае, если создаваемый процесс первый в системе, 
            // обрабатываем исключительную ситуацию так, что заголовочный элемент выступает в роли опорного,
            // вставка производится после него
            ProcessDesc current = getProcessList();
            ProcessDesc temp = new ProcessDesc(new Process(getNextPid(), getNextPid(), threadQ), current, current.getNext());
            current.getNext().setPrev(temp);
            current.setNext(temp);
            processesQuantity += 1;
            return temp;
        } catch (NotFoundException NFE) { // в случае, когда искомый процесс не найден, пробрасываем соотв. исключение
            throw new NotFoundException(NFE.getMessage());
        }
        
    }

    // завершение процесса, принимает идентификатор нужного процесса, может генерировать несколько исключений
    // в случае, если поиск не дал результатов, в случае, если в системе не запущен ни один процесс
    public ProcessDesc killProcess(int pId) throws NoProcessesException, NotFoundException {
        try { 
            ProcessDesc current = find(pId); // пробуем найти процесс с заданным Id
            if (current.getCurrent().getId() == pId) { // есть два варианта, поиск вернул процесс с нужным айди
                // либо процесс, содержащий поток с данным айди, в этом случае найден именно процесс
                current.getPrev().setNext(current.getNext()); // корректируем ссылки предыдущего за удаляемым узла
                current.getNext().setPrev(current.getPrev()); // корректируем ссылки следующего за удаляемым узла
                processesQuantity -= 1; // уменьшаем счетчик кол-ва процессов в системе
                return current; // вернем удаляемый узел
            // если нашли поток с данынным айди - генерируем исключение    
            } else throw new NotFoundException("Thread with specified TID: "+ pId + " finded, no process with specified Id, thread belongs to process with this PID: " + current.getCurrent().getId()+ ". Try again with another PID");
        } catch (NoProcessesException NPE) { // пробрасываем исключения
            throw new NoProcessesException(NPE.getMessage());
        } catch (NotFoundException NFE) {
            throw new NotFoundException(NFE.getMessage());
        }
    }

    // возвращаем состояние системы в виде строки, если есть что возвращать, иначе исключение
    public String returnTasksState() throws NoProcessesException {
        if (isEmpty()) throw new NoProcessesException();
        StringBuilder tempState = new StringBuilder(); // вместо конкотенации быстрее использовать стрингбилдер
        ProcessDesc temp = getProcessList().getNext(); // проход в прямом порядке по списку
        while (temp != getProcessList()) { // пока не достигли конца списка
            tempState.append(temp.getCurrent().getId()); // добавляем информ. о процессе
            tempState.append(" : ");
            tempState.append(temp.getCurrent().returnThreadsState()); // и о его потоках
            tempState.append("\n");
            temp = temp.getNext(); // переходим к следующему узлу
        }
        return tempState.toString(); // возвращаем состояние
    }

    // метод поиска, принимает идентификатор искомого процесса, если список пуст - исключение, не найден - тоже
    public ProcessDesc find(int findId) throws NoProcessesException, NotFoundException {
        if (isEmpty()) throw new NoProcessesException();
        ProcessDesc temp = getProcessList().getPrev(); // проход в обратном порядке
        // пока не найден или не достигнут конец списка
        while ((temp != getProcessList()) && ((temp.getCurrent().getId())!=findId)){ 
            try {
                temp.getCurrent().find(findId).getId(); // ищем в потоках текущего процесса
                return temp; // возвращаем процесс, в котором есть поток с искомым айди 
            } catch (NotFoundException NFE) { // если в потоках не найден
                    temp = temp.getPrev(); // переходим к предыдущему процессу
            }
        }
        // раз мы все еще здесь и если текущий узел - заголовок, следовательно мы ничего не нашли
        if (temp == getProcessList()) throw new NotFoundException("No Process or Thread wit that Id finded"); 
        return temp; // иначе мы наткнулись на процесс с таким айди
    }

    // сохраняем все данные в файл, статичный метод, поэтому принимает контейнер в качестве параметра
    // а также имя файла, в который сохраняет структуру, генрирует исключения, 
    // если в системе нет процессов(не имеет смысла сохранять), при ошибках ввода\вывода, если указан несуществующий файл
    public static void hibernate(TaskManageSubsystem taskSys, String filename) throws NoProcessesException, FileNotFoundException, IOException {
        if (taskSys.isEmpty()) throw new NoProcessesException();
        try {
            FileOutputStream fo = new FileOutputStream(filename); // создает объект файла потока вывода
            ObjectOutputStream so = new ObjectOutputStream(fo); // создает на его основе объект
            so.writeObject(taskSys); // пишет в него сериализованный объект системы
            so.flush(); // записывает буфер
        } catch (FileNotFoundException fNFE) {
            throw new FileNotFoundException(fNFE.getMessage());
        } catch (IOException iOE) {
            throw new IOException(iOE.getMessage());
        }
    }

    // загружаем систему из файла, статичный метод, в качестве параметра принимает имя файла, 
    // в котором сохранена структура, генрирует исключения, 
    // если не найден подходящий объект, при ошибках ввода\вывода, если указан несуществующий файл
    public static TaskManageSubsystem unhibernate(String filename) throws FileNotFoundException, IOException, ClassNotFoundException{
        try {
            FileInputStream fi = new FileInputStream(filename); // создает объект файла потока ввода
            ObjectInputStream si = new ObjectInputStream(fi);  // создает на его основе объект
            TaskManageSubsystem deserializeclass = (TaskManageSubsystem)si.readObject(); // загружает из него сериализованный объект системы
            return deserializeclass; // возвращает считанный объект
	} catch (FileNotFoundException fNFE) {
            throw new FileNotFoundException(fNFE.getMessage());
        } catch (IOException iOE) {
            throw new IOException(iOE.getMessage());
        } catch (ClassNotFoundException cNFE) {
            throw new ClassNotFoundException(cNFE.getMessage());
        }
       
    }

    
    public ProcessDesc getProcessList() {
        return ProcessList; // возвращает заголовок списка
    }

    
    public int getProcessesQuantity() { // возвращает кол-во запущенных процесов в системе
        return processesQuantity;
    }


}
=======
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package kurs;

import java.io.*;

/**
 *
 * @author Matrix
 */
public class TaskManageSubsystem implements TaskMngSubSystmIntrface, Serializable{
    
    private int OSType; 
    private ProcessDesc ProcessList; //list header
    private int nextPid;
    private int processesQuantity;

    public TaskManageSubsystem(int selOSType) {
        OSType = selOSType;
        nextPid = 0;
        processesQuantity = 0;
        ProcessList = new ProcessDesc(null, null, null);
        ProcessList.setNext(ProcessList);
        ProcessList.setPrev(ProcessList);
    }

    /**
     * @return the OSType
     */
    public int getOSType() {
        return OSType;
    }

    /**
     * @param OSType the OSType to set
     */
    public void setOSType(int OSType) {
        this.OSType = OSType;
    }

    /**
     * @return the nextPid
     */
    public int getNextPid() {
        nextPid += 1;
        return nextPid;
    }

    /**
     * @param nextPid the nextPid to set
     
    public void setNextPid(int nextPid) {
        this.nextPid = nextPid;
    }
    */

    public boolean isEmpty() {
        return getProcessList() == getProcessList().getNext();
    }

    public ProcessDesc createProcess(int pId, Boolean afterCurr, int threadQ) throws NotFoundException, InputErrorException { //1-afterCurr declare Order of adding, 2- threads quantity in constructor params
        if (threadQ == 0) {
            throw new InputErrorException("Threads quantity most be more than zero"); //поток у процесса должен быть хотя бы один
        } 
        try {
            ProcessDesc current = find(pId);
            if (current.getCurrent().getId() != pId) throw new NotFoundException("Process with specified PID: "+ pId +" not founded");
            else {
                if (afterCurr) {
                    ProcessDesc temp = new ProcessDesc(new Process(getNextPid(), getNextPid(), threadQ), current, current.getNext());
                    current.getNext().setPrev(temp);
                    current.setNext(temp);
                    processesQuantity += 1;
                    return temp;
                } else {
                    ProcessDesc temp = new ProcessDesc(new Process(getNextPid(), getNextPid(), threadQ), current.getPrev(), current);
                    current.getPrev().setNext(temp);
                    current.setPrev(temp);
                    processesQuantity += 1;
                    return temp;
                }
                
            }
        } catch (NoProcessesException NPE) {
            ProcessDesc current = getProcessList();
            ProcessDesc temp = new ProcessDesc(new Process(getNextPid(), getNextPid(), threadQ), current, current.getNext());
            current.getNext().setPrev(temp);
            current.setNext(temp);
            processesQuantity += 1;
            return temp;
        } catch (NotFoundException NFE) {
            throw new NotFoundException(NFE.getMessage());
        }
        
    }

    public ProcessDesc killProcess(int pId) throws NoProcessesException, NotFoundException {
        try {
            ProcessDesc current = find(pId);
            if (current.getCurrent().getId() == pId) {
                current.getPrev().setNext(current.getNext());
                current.getNext().setPrev(current.getPrev());
                processesQuantity -= 1;
                return current;
            } else throw new NotFoundException("Thread with specified TID: "+ pId + " finded, no process with specified Id, thread belongs to process with this PID: " + current.getCurrent().getId()+ ". Try again with another PID");
        } catch (NoProcessesException NPE) {
            throw new NoProcessesException(NPE.getMessage());
        } catch (NotFoundException NFE) {
            throw new NotFoundException(NFE.getMessage());
        }
    }

    public String returnTasksState() throws NoProcessesException {
        if (isEmpty()) throw new NoProcessesException();
        StringBuilder tempState = new StringBuilder();
        ProcessDesc temp = getProcessList().getNext();
        while (temp != getProcessList()) {
            tempState.append(temp.getCurrent().getId());
            tempState.append(" : ");
            tempState.append(temp.getCurrent().returnThreadsState());
            tempState.append("\n");
            temp = temp.getNext();
        }
        return tempState.toString();
    }

    public ProcessDesc find(int findId) throws NoProcessesException, NotFoundException {
        if (isEmpty()) throw new NoProcessesException();
        ProcessDesc temp = getProcessList().getPrev();
        while ((temp != getProcessList()) && ((temp.getCurrent().getId())!=findId)){
            try {
                temp.getCurrent().find(findId).getId();
                return temp;
            } catch (NotFoundException NFE) {
                    temp = temp.getPrev();
            }
        }
        if (temp == getProcessList()) throw new NotFoundException("No Process or Thread wit that Id finded");
        return temp;
    }

    public static void hibernate(TaskManageSubsystem taskSys, String filename) throws NoProcessesException, FileNotFoundException, IOException {
        if (taskSys.isEmpty()) throw new NoProcessesException();
        try {
            FileOutputStream fo = new FileOutputStream(filename);
            ObjectOutputStream so = new ObjectOutputStream(fo);
            so.writeObject(taskSys);
            so.flush();
        } catch (FileNotFoundException fNFE) {
            throw new FileNotFoundException(fNFE.getMessage());
        } catch (IOException iOE) {
            throw new IOException(iOE.getMessage());
        }
    }

    public static TaskManageSubsystem unhibernate(String filename) throws FileNotFoundException, IOException, ClassNotFoundException{
        try {
            FileInputStream fi = new FileInputStream(filename);
            ObjectInputStream si = new ObjectInputStream(fi);  
            TaskManageSubsystem deserializeclass = (TaskManageSubsystem)si.readObject();
            return deserializeclass;
	} catch (FileNotFoundException fNFE) {
            throw new FileNotFoundException(fNFE.getMessage());
        } catch (IOException iOE) {
            throw new IOException(iOE.getMessage());
        } catch (ClassNotFoundException cNFE) {
            throw new ClassNotFoundException(cNFE.getMessage());
        }
       
    }

    /**
     * @return the ProcessList
     */
    public ProcessDesc getProcessList() {
        return ProcessList;
    }

    /**
     * @return the processesQuantity
     */
    public int getProcessesQuantity() {
        return processesQuantity;
    }

    

}
>>>>>>> .r60
